// #include <iostream>
// using namespace std;
// int globalVar = 1;
// static int staticGlobalVar = 1;
// int main() {
//     static int staticVar = 1;
//     int localVar = 1;
//     int nums[10] = {1, 2, 3, 4, 5};
//     char str1[] = "hello";
//     char str2[] = "hello";
//     int* ptr1 = (int*)malloc(sizeof(int) * 4);
//     int* ptr2 = (int*)calloc(4, sizeof(int));
//     int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
//     free(ptr1);
//     free(ptr2);
//     return 0;
// }



// #include <iostream>
// using namespace std;
// int main() {
//     int a = 1;
//     int b = 2;
//     int* c = (int*)malloc(sizeof(int)*5);
//     int* d = (int*)malloc(sizeof(int)*5);
//     cout << "stack:" << endl;
//     cout << &a << endl;
//     cout << &b << endl;
//     cout << "heap:" << endl;
//     cout << c << endl;
//     cout << d << endl;
//     return 0;
// }




// #include <cstdlib>
// #include <iostream>
// using namespace std;
// class Person {
// public:
//     Person() : age(0) {
//         cout << "Person()" << endl;
//     }
//     ~Person() {
//         cout << "~Person" << endl;
//     }
// private: 
//     int age;
// };
// int main() {
// // // 单个类型的申请
// // int* p = new int;
// // delete p;
// // // C语言写法
// // int* p_c = (int*)malloc(sizeof(int));
// // free(p_c);
// // 多个类型的申请
// // int* p = new int[5];
// // delete[] p;
// // // C语言的写法
// // int* p_c = (int*)malloc(sizeof(int) * 5);
// // free(p_c);

// // // 申请单个类型并初始化位5
// // int* p = new int(5);
// // delete p;
// // // C语言实习
// // int* p_c = (int*)malloc(sizeof(int));
// // *p_c = 5;
// // free(p_c);
// // 申请多个类型并初始化
// // int* p = new int[5]{0, 1, 2, 3, 4};
// // delete[] p;
// // // C语言写法
// // int* p_c = (int*)malloc(sizeof(int) * 5);
// // for(int i = 0; i < 5; i++) {
// //     p_c[i] = i;
// // }
// // free(p_c);
// // 申请单个自定义类型
// // Person* p = new Person;
// // delete p;
// // // C语言写法
// // Person* p_c = (Person*)malloc(sizeof(Person));
// // free(p_c);
// // 申请多个自定义类型
// // Person* p = new Person[5];
// // delete[] p;
// // // C语言的实现
// // Person* p_c = (Person*)malloc(sizeof(Person) * 5);
// // free(p_c);
//     // int *p = (int *)operator new(sizeof(int) * 5);
//     // operator delete(p);
//     // // 等价于
//     // int *p_c = (int *)malloc(sizeof(int) * 5);
//     // free(p_c);
    
//     return 0;
// }


#include <iostream>
using namespace std;
class test {
    public:
        test(int a = 0) : x(a) {
            cout << "test(int a = 0)" << endl;
        }
        ~test() {
            cout << "~test()" << endl;
        } 
    private:
        int x;
};
int main() {
    // 使用第一种方式
    test* p1 = (test*)malloc(sizeof(test));
    new(p1)test;

    // 使用第二种方式
    test* p2 = (test*)malloc(sizeof(test));
    new(p2)test(1);

    // 显示调用析构函数
    p1->~test();
    p2->~test();
    return 0;
}